﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<windows.h>


//一、make和makefile

//1.1背景

//• 会不会写makefile，从一个侧面说明了一个⼈是否具备完成大型工程的能力 
//• 一个工程中的源文件不计数，其按类型、功能、模块分别放在若干个目录中，makefile定义了一
//系列的规则来指定，哪些文件需要先编译，哪些文件需要后编译，哪些文件需要重新编译，甚至
//于进行更复杂的功能操作
//• makefile带来的好处就是----“自动化编译”，一旦写好，只需要一个make命令，整个工程完全
//自动编译，极大的提⾼了软件开发的效率。
//• make是一个命令工具，是一个解释makefile中指令的命令工具，一般来说，大多数的IDE都有这
//个命令，比如：Delphi的make，Visual C++的nmake，Linux下GNU的make。可⻅，makefile
//都成为了一种在工程方面的编译方法。
//• make是一条命令，makefile是一个文件，两个搭配使用，完成项目自动化构建


//1.2make/makefile的创建与使用：
//如下图：


//项目清理
//• 工程是需要被清理的
//• 像clean这种，没有被第一个目标文件直接或间接关联，那么它后面所定义的命令将不会被⾃动
//执行，不过，我们可以显示要make执行。即命令⸺⸺“make clean”，以此来清除所有的目标
//文件，以便重编译。
//• 但是一般我们这种clean的目标文件，我们将它设置为伪目标, 用.PHONY 修饰, 伪目标的特性
//是，总是被执行的。
//• 可以将我们的 hello 目标文件声明成伪目标，测试一下

//连续的make我们发现不在编译，如何判断是否需要重新编译呢？
//通过比较可执行程序的修改时间和源文件最近一次的修改时间就可以知道是否需要重新编译
//如果可执行程序的修改时间比源文件最近一次的修改时间新，那么就不需要修改；
//如果可执行程序的修改时间比源文件最近一次的修改时间旧，那么就需要修改；
//make判断的是stat查看到文件的时间下的modify时间来判断是否执行的

//1.3stat查看时间指令

//1.3.1查看方式

//查看文件的相关时间：stat指令 + 文件名

//1.3.2查看到的三种时间

//文件 = 内容 + 属性
//（1）Modify: 内容变更，时间更新
//（2）Change：属性变更，时间更新
//（3）Access：常指的是文件最近一次被访问的时间。在Linux的早期版本中，每当文件被访问时，其
//atime都会更新。但这种机制会导致大量的IO操作。具体更新原则，不做过多解释。



//1.4伪目标（.PHONY）

//1.4.1伪目标的引入

//make会根据源文件个目标文件的新旧，来判断是否需要重新执行依赖关系进行编译，也就是说make不一定总是能被执行
//那么这个时候我们就可以在makefile文件头部加上 .PHONY:（要总是被执行的文件名），就可以保证一直执行了

//1.4.2伪目标的作用

//.PHONY:让make忽略源文件和可执行目标文件的Modify时间对比

//注意：为了让我们每次执行的后形成的可执行文件是最新的，所以我们要在clean前面带上伪目标.PHONY

//1.5扩展

//在makefile中，gcc不用在八文件名字写全了，可以使用$@和$^
// mytest:test.c
//		gcc -o $@ $^
//$@:代表目标名。 $ ^ : 代表依赖文件列表


//1.3总结
//（1）makefile中的注释使用#
//（2）make会自动推到makefile中的依赖关系，且推到的过程是一种栈式的结构
//（3）make会根据源文件个目标文件的新旧，来判断是否需要重新执行依赖关系进行编译，也就是说make不一定总是能被执行
//（4）如果不想在make执行的时候显示细节，可以在依赖方法前面加上@符号即可






